﻿using System;

/// <summary>
/// 1. 模式的结构
/// 外观（Facade）模式包含以下主要角色。 
/// 外观（Facade）角色：为多个子系统对外提供一个共同的接口。
/// 子系统（Sub System）角色：实现系统的部分功能，客户可以通过外观角色访问它。
/// 客户（Client）角色：通过一个外观角色访问各个子系统的功能。
/// </summary>
namespace Facade
{
    class Program
    {
        static void Main(string[] args)
        {
            ShapeMaker shapeMaker = new ShapeMaker();

            shapeMaker.drawCircle();
            shapeMaker.drawRectangle();
            shapeMaker.drawSquare();
        }
    }

    public interface Shape
    {
        void draw();
    }
    public class Rectangle : Shape
    {

        public void draw()
        {
            Console.WriteLine("Rectangle::draw()");
        }
    }
    public class Square : Shape
    {
        public void draw()
        {
            Console.WriteLine("Square::draw()");
        }
    }
    public class Circle : Shape
    {
        public void draw()
        {
            Console.WriteLine("Circle::draw()");
        }
    }

    /// <summary>
    /// 外观角色
    /// </summary>
    public class ShapeMaker
    {
        private Shape circle;
        private Shape rectangle;
        private Shape square;

        public ShapeMaker()
        {
            circle = new Circle();
            rectangle = new Rectangle();
            square = new Square();
        }

        public void drawCircle()
        {
            circle.draw();
        }
        public void drawRectangle()
        {
            rectangle.draw();
        }
        public void drawSquare()
        {
            square.draw();
        }
    }
}

